package bill

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// BillDetail 账单明细信息
//
// @author liaochangyi
// @since 2025-01-25
type BillDetail struct {
	// StartBusiDate 开始营业日期，yyyy-MM-dd
	StartBusiDate string `json:"start_busi_date,omitempty"`
	// EndBusiDate 结束营业日期，yyyy-MM-dd
	EndBusiDate string `json:"end_busi_date,omitempty"`
	// BillDate 结算时间，yyyy-MM-dd
	BillDate string `json:"bill_date,omitempty"`
	// Remark 备注，付款失败原因
	Remark string `json:"remark,omitempty"`
	// PayStatus 付款状态：0-待付款 1-付款成功 2-付款失败 3-无需付款
	PayStatus string `json:"pay_status,omitempty"`
	// PayAmt 付款金额
	PayAmt interface{} `json:"pay_amt,omitempty"`
	// TransCount 交易笔数
	TransCount interface{} `json:"trans_count,omitempty"`
	// SettleAccount 结算账户
	SettleAccount string `json:"settle_account,omitempty"`
	// RefundAmount 退票金额，单位：分
	RefundAmount interface{} `json:"refund_amount,omitempty"`
	// ReturnDate 退票日期
	ReturnDate string `json:"return_date,omitempty"`
	// ReturnReason 退票原因
	ReturnReason string `json:"return_reason,omitempty"`
	// AccountNo 退票卡号
	AccountNo string `json:"account_no,omitempty"`
}

// NewBillDetail 创建账单明细信息
func NewBillDetail() *BillDetail {
	return &BillDetail{}
}

// SettleBillQueryRequest 结算账单查询请求
//
// @author liaochangyi
// @since 2025-01-25
type SettleBillQueryRequest struct {
	models.OrgBaseRequest
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// StartBusiDate 开始营业日期，订单交易日期（订单交易日期/订单清算日期，二选一），结束时间减开始时间不能超过30天， yyyy-MM-dd
	StartBusiDate string `json:"start_busi_date,omitempty"`
	// EndBusiDate 结束营业日期，订单交易日期（订单交易日期/订单清算日期，二选一），结束时间减开始时间不能超过30天， yyyy-MM-dd
	EndBusiDate string `json:"end_busi_date,omitempty"`
	// StartSettleDate 开始结算日期，订单结算日期（订单交易日期/订单清算日期，二选一）， yyyy-MM-dd
	StartSettleDate string `json:"start_settle_date,omitempty"`
	// EndSettleDate 结束结算日期，订单结算日期（订单交易日期/订单清算日期，二选一）， yyyy-MM-dd
	EndSettleDate string `json:"end_settle_date,omitempty"`
	// PayStatus 付款状态，0-待付款 1-付款成功 2-付款失败 3-无需付款
	PayStatus string `json:"pay_status,omitempty"`
}

// NewSettleBillQueryRequest 创建结算账单查询请求
func NewSettleBillQueryRequest() *SettleBillQueryRequest {
	return &SettleBillQueryRequest{}
}

// SetMerchNo 设置商户号
func (r *SettleBillQueryRequest) SetMerchNo(merchNo string) *SettleBillQueryRequest {
	r.MerchNo = merchNo
	return r
}

// SetStartBusiDate 设置开始营业日期
func (r *SettleBillQueryRequest) SetStartBusiDate(startBusiDate string) *SettleBillQueryRequest {
	r.StartBusiDate = startBusiDate
	return r
}

// SetEndBusiDate 设置结束营业日期
func (r *SettleBillQueryRequest) SetEndBusiDate(endBusiDate string) *SettleBillQueryRequest {
	r.EndBusiDate = endBusiDate
	return r
}

// SetStartSettleDate 设置开始结算日期
func (r *SettleBillQueryRequest) SetStartSettleDate(startSettleDate string) *SettleBillQueryRequest {
	r.StartSettleDate = startSettleDate
	return r
}

// SetEndSettleDate 设置结束结算日期
func (r *SettleBillQueryRequest) SetEndSettleDate(endSettleDate string) *SettleBillQueryRequest {
	r.EndSettleDate = endSettleDate
	return r
}

// SetPayStatus 设置付款状态
func (r *SettleBillQueryRequest) SetPayStatus(payStatus string) *SettleBillQueryRequest {
	r.PayStatus = payStatus
	return r
}

// ToMap 转换为map
func (r *SettleBillQueryRequest) ToMap() (map[string]interface{}, error) {
	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}
	if r.StartBusiDate != "" {
		baseMap["start_busi_date"] = r.StartBusiDate
	}
	if r.EndBusiDate != "" {
		baseMap["end_busi_date"] = r.EndBusiDate
	}
	if r.StartSettleDate != "" {
		baseMap["start_settle_date"] = r.StartSettleDate
	}
	if r.EndSettleDate != "" {
		baseMap["end_settle_date"] = r.EndSettleDate
	}
	if r.PayStatus != "" {
		baseMap["pay_status"] = r.PayStatus
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *SettleBillQueryRequest) CheckRequiredParams(config *core.Config) error {
	return r.OrgBaseRequest.CheckRequiredParams(config)
}

// GetApiUrl 获取API URL
func (r *SettleBillQueryRequest) GetApiUrl() string {
	return "/open/bill/settle-bill/query"
}

// ==================== 结算账单查询响应 ====================

// SettleBillQueryResponse 结算账单查询响应
type SettleBillQueryResponse struct {
	models.StandardResponse
	// ErrMsg 错误信息
	ErrMsg string `json:"err_msg,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// StartBusiDate 开始营业日期，yyyy-MM-dd
	StartBusiDate string `json:"start_busi_date,omitempty"`
	// EndBusiDate 结束营业日期
	EndBusiDate string `json:"end_busi_date,omitempty"`
	// StartSettleDate 开始结算日期，yyyy-MM-dd
	StartSettleDate string `json:"start_settle_date,omitempty"`
	// EndSettleDate 结束结算日期
	EndSettleDate string `json:"end_settle_date,omitempty"`
	// PayAmt 付款金额
	PayAmt interface{} `json:"pay_amt,omitempty"`
	// TransCount 交易笔数
	TransCount interface{} `json:"trans_count,omitempty"`
	// BillDetailList 账单明细列表
	BillDetailList []*BillDetail `json:"bill_detail_list,omitempty"`
}

// NewSettleBillQueryResponse 创建结算账单查询响应
func NewSettleBillQueryResponse() *SettleBillQueryResponse {
	return &SettleBillQueryResponse{}
}
